/**
 * 系统日志路由
 */

import { Elysia, t } from 'elysia';
import {
  getLogs,
  getLogStats,
  cleanupLogs,
  exportLogs
} from '../controllers/logController';
import { guestAccessMiddleware } from '../middleware/auth';

export const logRoutes = new Elysia({ prefix: '/logs' })
  // 需要登录权限的路由（游客可查看，管理员可编辑）
  .use(guestAccessMiddleware())
  
  // 获取系统日志列表
  .get('/', getLogs, {
    detail: {
      tags: ['Logs'],
      summary: '获取系统日志列表',
      description: '获取系统日志列表，支持分页、筛选和搜索'
    },
    query: t.Object({
      page: t.Optional(t.String({ description: '页码，默认为1' })),
      limit: t.Optional(t.String({ description: '每页数量，默认为20' })),
      level: t.Optional(t.String({ description: '日志级别：info, warn, error, debug' })),
      module: t.Optional(t.String({ description: '模块名称' })),
      action: t.Optional(t.String({ description: '操作动作' })),
      startDate: t.Optional(t.String({ description: '开始日期 (ISO格式)' })),
      endDate: t.Optional(t.String({ description: '结束日期 (ISO格式)' })),
      search: t.Optional(t.String({ description: '搜索关键词（在消息中搜索）' }))
    })
  })
  
  // 获取日志统计信息
  .get('/stats', getLogStats, {
    detail: {
      tags: ['Logs'],
      summary: '获取日志统计信息',
      description: '获取指定天数内的日志统计信息，包括按级别和模块的分布'
    },
    query: t.Object({
      days: t.Optional(t.String({ description: '统计天数，默认为7天' }))
    })
  })
  
  // 导出日志
  .get('/export', exportLogs, {
    detail: {
      tags: ['Logs'],
      summary: '导出系统日志',
      description: '导出系统日志为CSV文件，支持筛选条件'
    },
    query: t.Object({
      startDate: t.Optional(t.String({ description: '开始日期 (ISO格式)' })),
      endDate: t.Optional(t.String({ description: '结束日期 (ISO格式)' })),
      level: t.Optional(t.String({ description: '日志级别：info, warn, error, debug' })),
      module: t.Optional(t.String({ description: '模块名称' }))
    })
  })
  
  // 清理过期日志
  .post('/cleanup', cleanupLogs, {
    detail: {
      tags: ['Logs'],
      summary: '清理过期日志',
      description: '删除指定天数之前的日志记录'
    },
    body: t.Object({
      days: t.Optional(t.String({ description: '保留天数，默认为30天' }))
    })
  });